﻿#Использовать logos

Перем юТест;
Перем Лог;

Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
	
	юТест = ЮнитТестирование;
	
	ВсеТесты = Новый Массив;
	
	ВсеТесты.Добавить("ТестДолжен_ПроверитьРазборСодержимого");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьПростойРазборСтрокиЗапроса");
	
	Каталог = КаталогПрограммы();
	ПодключитьВнешнююКомпоненту(ОбъединитьПути(Каталог, "oscript.exe"));
	
	Возврат ВсеТесты;
	
КонецФункции

Процедура ПередЗапускомТеста() Экспорт
	
	Лог = Логирование.ПолучитьЛог("oscript.tests.postdataparser");
	Лог.УстановитьУровень(УровниЛога.Информация);
	
КонецПроцедуры

Процедура ПослеЗапускаТеста() Экспорт
	Лог = Неопределено;
КонецПроцедуры

// 1 параметр, 1 файл из двух частей.
Функция ПолучитьПробноеСодержимое_1(Знач Ограничитель = "boundary")

	Возврат СтрЗаменить("--##boundary##
	|Content-Disposition: form-data; name=""text1""
	|
	|xcxcxcxcxcxcxcxc
	|--##boundary##
	|Content-Disposition: form-data; name=""file[]""; filename=""some.txt""
	|Content-Type: text/plain
	|
	|str1
	|str2
	|str3
	|str4
	|--##boundary##
	|Content-Disposition: form-data; name=""file[]""; filename=""some1.txt""
	|Content-Type: text/plain
	|
	|str4
	|уникода5
	|--##boundary##--",
		"##boundary##",
		Ограничитель
	);

КонецФункции

Функция ПолучитьДвоичныеДанные(Знач Содержимое)

	Перем ИмяФайла, Текст;

	ИмяФайла = ПолучитьИмяВременногоФайла(".txt");
	Текст = Новый ТекстовыйДокумент;
	Текст.УстановитьТекст(Содержимое);
	Текст.Записать(ИмяФайла, КодировкаТекста.Utf8NoBom);
	
	Возврат Новый ДвоичныеДанные(ИмяФайла);
	
КонецФункции

Функция ДвоичныеДанныеВСтроку(Знач Данные)

	Перем ИмяФайла, Текст;
	
	ИмяФайла = ПолучитьИмяВременногоФайла("txt");
	
	Данные.Записать(ИмяФайла);
	
	Текст = Новый ТекстовыйДокумент;
	Текст.Прочитать(ИмяФайла, КодировкаТекста.Utf8NoBom);
	
	Возврат Текст.ПолучитьТекст();

КонецФункции

Процедура ТестДолжен_ПроверитьРазборСодержимого() Экспорт

	Перем Ограничитель;
	
	Ограничитель = "boundary";

	ДвоичныеДанные = ПолучитьДвоичныеДанные(
		ПолучитьПробноеСодержимое_1(Ограничитель)
	);
	Данные = Новый ДанныеPOSTЗапроса(ДвоичныеДанные, Ограничитель);
	
	юТест.ПроверитьРавенство(Данные.Параметры.Количество(), 1);
	юТест.ПроверитьРавенство(Данные.Params.Количество(), 1);
	
	юТест.ПроверитьРавенство(Данные.Файлы.Количество(), 1);
	юТест.ПроверитьРавенство(Данные.Files.Количество(), 1);
	
	юТест.ПроверитьРавенство(
		Данные.Параметры.Получить("text1"), "xcxcxcxcxcxcxcxc",
		"Получение нефайловых данных запроса"
	);
	
	юТест.ПроверитьРавенство(
		Данные.Файлы.Получить("file[]").ИмяФайла, "some.txt",
		"Определение имени файла, состоящего из нескольких частей"
	);
	
	юТест.ПроверитьРавенство(
		Данные.Файлы.Получить("file[]").Имя, "file[]",
		"Определение имени параметра файла"
	);
	
	ТекстФайла = ДвоичныеДанныеВСтроку(Данные.Файлы.Получить("file[]").Данные);
	
	Текст = Новый ТекстовыйДокумент;
	Текст.УстановитьТекст(ТекстФайла);
	
	юТест.ПроверитьРавенство(Текст.КоличествоСтрок(), 5);
	
	юТест.ПроверитьРавенство(Текст.ПолучитьСтроку(1), "str1");
	юТест.ПроверитьРавенство(Текст.ПолучитьСтроку(2), "str2");
	юТест.ПроверитьРавенство(Текст.ПолучитьСтроку(3), "str3");
	юТест.ПроверитьРавенство(Текст.ПолучитьСтроку(4), "str4str4");
	юТест.ПроверитьРавенство(Текст.ПолучитьСтроку(5), "уникода5");
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьПростойРазборСтрокиЗапроса() Экспорт

	// Прописываю ожидаемое поведение явно, не завязываясь на UrlEncode
	СтрокаШаблон = 
			  "абвгдеё  "
			+ "жзийклмнопрстуфхцчшщъыьэюя"
	;
	СтрокаКодированная = 
			  "%D0%B0%D0%B1%D0%B2%D0%B3%D0%B4%D0%B5%D1%91++"
			+ "%D0%B6%D0%B7%D0%B8%D0%B9%D0%BA%D0%BB%D0%BC"
			+ "%D0%BD%D0%BE%D0%BF%D1%80%D1%81%D1%82%D1%83"
			+ "%D1%84%D1%85%D1%86%D1%87%D1%88%D1%89%D1%8A"
			+ "%D1%8B%D1%8C%D1%8D%D1%8E%D1%8F"
	;
	Данные = Новый ДанныеPOSTЗапроса("some=123&word=" + СтрокаКодированная);
	
	юТест.ПроверитьРавенство(Данные.Параметры.Количество(), 2);
	юТест.ПроверитьРавенство(Данные.Параметры["some"], "123");
	юТест.ПроверитьРавенство(Данные.Параметры["word"], СтрокаШаблон);
	
КонецПроцедуры
